﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.Codigo;
using SIIE_ERP.View;

namespace Elysium.Demo.PuntoVenta.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class CierreCaja_Alta : UserControl
    {
        UsuarioActivo _sesion;

        public CierreCaja_Alta(ref UsuarioActivo usuario)
        {
            InitializeComponent();
            this._sesion = usuario;
            CargarCatalogos();
            CargarDatos();
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("CierreCaja.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void CargarCatalogos()
        {
            ComboBoxUI.ComboCuentasBancarias(ComboCuentaSalida, _sesion);
        }

        private void CargarDatos()
        {
            var db = new SIIE_ERP.BaseDatos.PuntoVenta.Catalogos.dbo_Cat_Terminal(_sesion.RFC, _sesion.UserName);
            var terminal = db.Get_Terminal_Abierta() as DataRow;

            LabelTotalEfectivo.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Total_Cobrado_En_Efectivo() ?? 0).ToString("C");
            LabelNumeroEfectivo.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Numero_Cobrado_En_Efectivo() ?? 0).ToString();

            LabelNumeroTarjeta.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Numero_Cobrado_Con_Tarjeta() ?? 0).ToString();
            LabelTotalTarjeta.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Total_Cobrado_Con_Tarjeta() ?? 0).ToString("C");

            LabelTotalEntradas.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Total_Entradas_Dinero() ?? 0).ToString("C");
            LabelTotalSalidas.Content = (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Total_Salidas_Dinero() ?? 0).ToString("C");

            LabelTotalCaja.Content = Double.Parse(terminal["Saldo"].ToString()).ToString("C");
            LabelTotalTarjeta2.Content = LabelTotalTarjeta.Content.ToString();

            LabelGranTotal.Content = Double.Parse((Double.Parse(terminal["Saldo"].ToString()) + (new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName).Total_Cobrado_Con_Tarjeta() ?? 0)).ToString()).ToString("C");
            
        }
        
        private void Button_Guardar_Click(object sender, RoutedEventArgs e)
        {
            if (!Valida()) return;

            // Cerrar la caja

            var db = new SIIE_ERP.BaseDatos.PuntoVenta.Catalogos.dbo_Cat_Terminal(_sesion.RFC, _sesion.UserName);
            var terminalAbierta = db.Get_Terminal_Abierta() as DataRow;
            db.Execute_Cerrar_Terminal();

            // Registrar el movimiento
            var db3 = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Trans_MovimientoDineroCaja(_sesion.RFC, _sesion.UserName);
            db3.Insert_Trans_MovimientoDineroCaja( terminalAbierta["Id_Apertura"].ToString(),
                                                   terminalAbierta["Id_Terminal"].ToString(),
                                                   terminalAbierta["CuentaAsociada"].ToString(),
                                                   ComboCuentaSalida.SelectedValue.ToString(),
                                                   LabelTotalCaja.Content.ToString(),
                                                   "-");

            // Registrar el cierre de caja
            var db2 = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Cerrar_Terminal(_sesion.RFC, _sesion.UserName);
            db2.Insert_Cerrar_Terminal(terminalAbierta["Id_Apertura"].ToString(),
                                       terminalAbierta["Id_Terminal"].ToString(),
                                       ComboCuentaSalida.SelectedValue.ToString(),
                                       LabelTotalCaja.Content.ToString());

            // Mover el dinero a la cuenta

            var banco = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName);

            var Monto = Double.Parse(LabelTotalCaja.Content.ToString());
            banco.Update_Saldo_Cuenta_Bancaria_Por_Id(Int32.Parse(ComboCuentaSalida.SelectedValue.ToString()), Monto);
            banco.Update_Saldo_Cuenta_Bancaria_Por_Id(Int32.Parse(terminalAbierta["CuentaAsociada"].ToString()), Monto * (-1));

            // Registrar el movimiento en conciliacion

            var Pesos = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName).Get_Moneda_Por_Nombre("Pesos Mexicanos").Rows[0]["Id_Moneda"].ToString();

            var conciliacion = new SIIE_ERP.BaseDatos.Bancos.dbo_Trans_Conciliacion(_sesion.RFC, _sesion.UserName);
            conciliacion.Insert_Transaccion_Bancaria(terminalAbierta["CuentaAsociada"].ToString(),
                                                     ComboCuentaSalida.SelectedValue.ToString(),
                                                     "0",
                                                     Pesos,
                                                     Monto.ToString(),
                                                     "Cierre de caja");

            _sesion.PV_CajaIsOpen = false;
            _sesion.PV_Id_Terminal = 0;

            MessageBox.Show("Caja cerrada exitosamente.");

            (this.Parent as ScrollViewer).Content = null;
        }

        private bool Valida()
        {
            if (ComboCuentaSalida.SelectedValue == null)
            {
                MessageBox.Show("Debe seleccionar una cuenta de salida"); return false; 
            }
            return true;
        }

    }
}
